/* 
1.获取用户的收货地址
  1.绑定点击事件
  2.调用小程序内置的API 获取用户的收货地址 chooseAddress
    1.获取用户对小程序所授予的获取地址的权限状态 
      wx.getSetting({
        success:(res)=>{
          res.authSetting={scope.address:true/false}
        }
      })
     
      1.假设用户点击获取收货地址的提示框确定
        scope 值 true
            
      3.假设用户点击获取收货地址的提示框不确定
        scope 值 undefined

      2.假设用户点击获取收货地址的提示框取消
        scope 值 false

        诱导用户自己打开授权设置页面  当用户重新给予 获取地址权限的时候
        获取收获地址
        wx.openSetting({       
          success:()=>{
            
          }
        })
2. 页面加载完毕
  1.获取本地存储中的地址数据
  2.把数据 设置给data中的一个变量

3.onShow
  0.回到了商品详情页面  第一次添加商品的时候 手动添加了属性
      1.num=1
      2.checked=true
  1.获取缓存中的购物车数组
  2.把购物车数据 填充到data中
4.全选的实现  数据的展示
  1.onshow 获取缓存中的购物车数组
  2.根据购物车中的商品数据  所有的商品都被选中 checked=true 全选就被选中
5.总价格和总数量
  1.都需要商品被选中  我们才用它来计算
  2.获取购物车数组
  3.遍历
  4.判断商品是否被选中
6.商品的选中
  1.绑定change事件
  2.获取到被修改的商品对象
  3.商品对象的选中状态 取反
  4.重新田中会data中和缓存中
  5.重新计算全选  总价格  总数量
7.复选框的全选和反选功能
  1.全选复选框的绑定事件 change
  2.获取data中的全选变量 allChecked
  3.直接取反allChecked=!allChecked
  4.遍历购物车数组 让里面 商品 选中状态跟随 allChecked 改变而改变
  5.把购物车数组和allChecked重新设置data 把购物车重新设置回缓存中
8.商品数量的编辑
  1."+" "-" 按钮 绑定同一个点击事件 区分的关键 自定义属性
      "+" +1
      "-" -1
  2.传递被点击的商品id goods_id
  3.获取data中的购物车数组 来获取需要被修改的商品对象
  4.直接修改商品对象的数量 num
    当购物车的数量=1 同时 用户点击 "-"
    弹窗提示 询问用户 是否要删除
    1.确定 直接执行删除
    2.取消 什么都不做
  5.把cart数组 重新设置会缓存中和data中的this.data
9.支付判断
  1.有无商品
  2.有无地址
  3.通过验证  跳转支付页面
  */
import { getSetting, chooseAddress, openSetting, showModal, handlepay} from "../../utils/asyncWx.js"
import regeneratorRuntime from '../../lib/runtime/runtime';
Page({
  data:{
    address:'',
    cart:'',
    allChecked:false,
    totalPrice:0,
    totalNum:0
  },
  onShow(){
    // 1.获取缓存中的收货地址信息
    const address=wx.getStorageSync('address');

    // 获取缓存中的购物车数据
    const cart=wx.getStorageSync('cart')||[];
    // 计算全选
    // every 数组方法 会遍历 会接受一个回调函数 那么 每一个回调函数都返回true 那么 every方法的返回值为true
    // 只要有一个回调函数返回false 就不再循环  直接返回false
    // 空数组调用every会返回true
    // const allChecked=cart.length?cart.every(v=>v.checked):false 
   this.setData({
     address
   });
   this.setCart(cart)
      
  },
  // 点击收货地址
  async handleChooseAddress(){
    try {
      const res1 = await getSetting();
      const scopeAddress = res1.authSetting['scope.address']
      if (scopeAddress === false) {
        await openSetting();
      }
      const address = await chooseAddress();
      address.all=address.provinceName+address.cityName+address.countyName+address.detailInfo
      wx.setStorageSync("address", address);
      this.setData({
        address
      })
    } catch (error) {
      console.log(error)
    }
  },
  // 商品的选中
  handeItemChange(e){
    // 获取被修改的商品的id
    const goods_id=e.currentTarget.dataset.id;
    // 获取缓存中的购物车列表
    let cart = this.data.cart;
    // 找到被修改的商品对象
    let index=cart.findIndex(v=>v.goods_id===goods_id);
    // 选中状态取反
    cart[index].checked=!cart[index].checked;
    // 将数据存入到data和缓存中
    this.setCart(cart)
  },
  // 设置购物车状态同时  重新计算 底部工具栏的数据 全选 中价格 购买的数量
  setCart(cart){
    let allChecked = true;
    let totalPrice = 0;
    let totalNum = 0;
    cart.forEach(v => {
      if (v.checked) {
        totalPrice += v.num * v.goods_price;
        totalNum += v.num;
      } else {
        allChecked = false
      }
    });
    allChecked = cart.length != 0 ? allChecked : false;
    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    });
    wx.setStorageSync('cart', cart);
  },
  handleAllChange(e){
    let allChecked = !this.data.allChecked
    let cart=this.data.cart;
    cart.forEach(v => v.checked=allChecked)
    this.setCart(cart)
  },
  async handleItemNumEdit(e){
    let index=e.currentTarget.dataset.id;
    let operation = e.currentTarget.dataset.operation
    let cart=this.data.cart;
    let cart_id=cart.findIndex(v => v.goods_id===index);
    if (cart[cart_id].num===1&&operation===-1){
      const res = await showModal('确定要删除吗?')
      if(res.confirm){
        cart.splice(cart_id,1)
        this.setCart(cart)
      }
    }else{
      cart[cart_id].num+=operation;
      this.setCart(cart)
    }

  },
  async handlepay(){
    let {address,totalNum}=this.data;
    if(!address.userName){
      await handlepay('请先设置收货地址')
      return;
    }else if(totalNum===0){
      await handlepay('您还未选购商品')
      return;
    }else{
      wx.navigateTo({
        url: '/pages/pay/index'
      });
      return;
    }
  }
})
